 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=31 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Beware of instanceof operator
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='override,pitfall,polymorphism,instanceof,java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Beware of instanceof operator</div>

<div class='main-body'>
 
<br>Many hold that the <tt>instanceof</tt> operator should be used only
as a last resort, and that an overridden method is usually (but not always)
a better alternative.
<p>The <tt>instanceof</tt> operator can be used to call a method based <i>explicitly</i>
on the class of some object, instead of <i>implicitly</i> using an
overridden method and polymorphism. Thus, inexperienced programmers may
mistakenly use <tt>instanceof</tt> where an overidden method is more appropriate.
<p>A common exception to this guideline, however, is the use of <tt>instanceof</tt>
within an <tt><a href="TopicAction1deb-2.html">equals</a></tt> method.
<p>From <i>Effective C++</i>, by Scott Meyers :
<p><i>"Anytime you find yourself writing code of the form "if the object
is of type T1, then do something, but if it's of type T2, then do something
else," slap yourself.</i>

<P>Here is an example of the type of abuse Scott Meyers is speaking of :
<br>
<PRE>

<span class='comment'>/**
* Naive, incorrect use of instanceof.
*/</span>
<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> BadInstanceOf {

  <span class='keyword'>public</span> <span class='keyword'>static</span> <span class='keyword'>void</span> doSomething(Animal aAnimal){
    <span class='keyword'>if</span> (aAnimal <span class='keyword'>instanceof</span> Fish){
      Fish fish = (Fish)aAnimal;
      fish.swim();
    }
    <span class='keyword'>else</span> <span class='keyword'>if</span> (aAnimal <span class='keyword'>instanceof</span> Spider){
      Spider spider = (Spider)aAnimal;
      spider.crawl();
    }
  }

  <span class='comment'>// PRIVATE //
</span>  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>class</span> Animal {}

  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>final</span> <span class='keyword'>class</span> Fish <span class='keyword'>extends</span> Animal {
    <span class='keyword'>void</span> swim(){}
  }
  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>final</span> <span class='keyword'>class</span> Spider <span class='keyword'>extends</span> Animal {
    <span class='keyword'>void</span> crawl(){}
  }
} 
</PRE>
<br>
The mistake is corrected by using an overridable method :
<br>
<PRE>

<span class='comment'>/**
* Using polymorphism to call different methods.
* Does not use instanceof.
*/</span>
<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> BadInstanceOfFixed {

  <span class='keyword'>public</span> <span class='keyword'>static</span> <span class='keyword'>void</span> main(String... aArgs){
    log(<span class='literal'>"Starting..."</span>);
     Animal animal = <span class='keyword'>new</span> Animal();
     doSomething(animal);
     
     <span class='comment'>//repoint the same 'animal' reference to other objects :
</span>     
     animal = <span class='keyword'>new</span> Fish();
     doSomething(animal);
     
     animal = <span class='keyword'>new</span> Spider();
     doSomething(animal);
     
     log(<span class='literal'>"Done."</span>);
  }

  <span class='comment'>/**
  * This method implementation doesn't care at all 
  * about Fish/Spider. It just knows that it has 
  * been passed an Animal. Different versions of 
  * 'move' are called, specific to each Animal. 
  */</span>
  <span class='keyword'>public</span> <span class='keyword'>static</span> <span class='keyword'>void</span> doSomething(Animal aAnimal){
    aAnimal.move();
  }

  <span class='comment'>// PRIVATE //
</span>  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>class</span> Animal {
    <span class='keyword'>void</span> move(){
      log(<span class='literal'>"Move like an animal..."</span>);
    }
  }

  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>final</span> <span class='keyword'>class</span> Fish <span class='keyword'>extends</span> Animal {
    <span class='keyword'>void</span> move(){
      log(<span class='literal'>"Move like a fish..."</span>);
    }
  }
  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>final</span> <span class='keyword'>class</span> Spider <span class='keyword'>extends</span> Animal {
    <span class='keyword'>void</span> move(){
      log(<span class='literal'>"Move like a spider..."</span>);
    }
  }

  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>void</span> log(String aMessage){
    System.out.println(aMessage);
  }
} 
</PRE>
<br>
An example run of this class :
<PRE>Starting...
Move like an animal...
Move like a fish...
Move like a spider...
Done.</PRE>
<br>
<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicAction1deb-2.html?Id=17'>Implementing equals</a> <br>
 
  
  <a href='TopicAction56bf-2.html?Id=227'>Avoid basic style errors</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='31'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=31 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:07 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
